/**
 * @addtogroup jtc_msg_808
 * jtc_msg_808_session_interface
 * @{
 */
 /**
 * @file         jtc_msg_808_session_interface.h
 * @brief        交通部消息808会话接口
 * @note    
 * @author       Akee
 * @date         2020-06-16
 * @version      1.0
 *
 * @par          修改日志
 * <table>
 * <tr><th>Date        <th>Version               <th>Author          <th>Description
 * <tr><td>2020-06-16  <td>1.0                   <td>Akee            <td>创建初始版本
 * @copyright    杭州鸿泉物联网技术股份有限公司
 */
#ifndef _JTC_MSG_808_SESSION_INTERFACE_H_
#define _JTC_MSG_808_SESSION_INTERFACE_H_

#include "jtmsg808/jtc_msg_808.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef struct IJtMsg808SessionTag IJtMsg808Session;

/**
 * 发送消息
 * @param sender: 接口指针
 * @param msg: 需要发送的消息,内部不会释放消息
 * @param encode_success: 编码是否成功,若为NULL，则忽略参数,编码失败一般指长度超过1024
 * @return True: 成功; False: 失败
 * @note 发送成功肯定是编码成功，发送失败可能是编码失败或者参数为空
 */
typedef Bool(*IJtMsg808SessionDoSendMsg)(IJtMsg808Session *sender, TJtMsg808 *msg, Bool *encode_success);

/**
 * 发送数据
 * @param sender: 接口指针
 * @param data: 需要发送的数据
 * @param data_size: 数据大小
 * @return > 0: 实际发送的数据大小; <0: 参数错误; 0: 网络未鉴权成功，也有可能总线底层无缓冲
 * @note 不能保证data_size一次性能全部发出去,内部会判断已经处于鉴权成功状态下才允许发送数据
 */
typedef Int32(*IJtMsg808SessionDoSendData)(IJtMsg808Session *sender, const void *data, Int32 data_size);


/**
 * 目前是否已经鉴权成功，处于在线状态,若在注册过程中，也属于不在线
 * @param sender: 接口指针
 * @return True: 在线状态; False: 不在线状态
 */
typedef Bool (*IJtMsg808SessionDoIsOnLine)(IJtMsg808Session *sender);

/**
 * 断开会话连接
 * @param sender: 接口指针
 * @return
 */
typedef void(*IJtMsg808SessionDoDisconnect)(IJtMsg808Session *sender);

/**
 * 获取当前通道的会话参数修改使能,主要针对0x8103参数设置
 * @param self: 对象指针
 * @return True: 可设置; False: 不可设置
 */
typedef Bool (*IJtMsg808SessionDoParamMotifyEnable)(IJtMsg808Session *sender);

/**
 * 设置当前通道的会话参数修改使能,主要针对0x8103参数设置
 * @param self: 对象指针
 * @param enable: True: 可设置0x8103; False: 不可设置0x8103
 * @return
 */
typedef void (*IJtMsg808SessionDoSetParamMotifyEnable)(IJtMsg808Session *sender, Bool enable);

/**
 * 交通部消息808会话接口
 */
struct IJtMsg808SessionTag
{
PROTECTED
    IJtMsg808SessionDoSendMsg DoSendMsg;        ///< 发送消息
    IJtMsg808SessionDoSendData DoSendData;      ///< 发送流数据
    IJtMsg808SessionDoIsOnLine DoIsOnLine;      ///< 会话是否在线
    IJtMsg808SessionDoDisconnect DoDisconnect;  ///< 断开连接
    IJtMsg808SessionDoParamMotifyEnable DoParamMotifyEnable;
    IJtMsg808SessionDoSetParamMotifyEnable DoSetParamMotifyEnable;
};

Bool IJtMsg808SessionSendMsg(IJtMsg808Session *self, TJtMsg808 *msg, Bool *encode_success);
Int32 IJtMsg808SessionSendData(IJtMsg808Session *self, const void *data, Int32 data_size);
Bool IJtMsg808SessionIsOnLine(IJtMsg808Session *self);
void IJtMsg808SessionDisconnect(IJtMsg808Session *self);
Bool IJtMsg808SessionParamMotifyEnable(IJtMsg808Session *self);
void IJtMsg808SessionSetParamMotifyEnable(IJtMsg808Session *self, Bool enable);

#ifdef __cplusplus
} // extern "C" {
#endif

#endif
/**
 * @} 
 */



